<template>
  <el-date-picker :id="name" size="small" :type="type" v-model="valueModel"
                  range-separator="至" :start-placeholder="placeholders[0]" :end-placeholder="placeholders[1]"
                  @change="onChange" :pickerOptions="pickerOptions" clearable></el-date-picker>
</template>

<script>
/* eslint-disable */
import Layers from "@/lang/layers";
import {InputType} from "@/lang/fast-form";

/**
 * 日期范围选择
 */
export default {
    name: "SmartDateRange"
    , components: {}
    , inject: ['fast_form']
    , props: {
        // 字段名
        name: {type: String}
        // 类型，默认输入框
        , type: {type: String, default: 'daterange'}
        // 默认值
        , value: {type: Array, default: undefined}
        // 文字提示
        , placeholder: {type: [String, Array], default: () => ['开始日期', '结束日期']}
        // 原生的参数设置
        , options: {type: Object, default: Layers.object}
        // 原生的快捷键设置
        , shortcuts: {type: [Array, Boolean], default: undefined}
    }
    , watch: {
        value: {
            handler: function (val) {
                this.input.setFormatValue(val);
            }
        }
    }
    , data() {
        return {
            // 值模型，用于计算的值，任何时候都不允许为空，避免 vue 联动失效
            valueModel: undefined
            // fast-form 表单接口
            , input: undefined
            // 原生的参数设置
            , pickerOptions: undefined
            // 提示性语句
            , placeholders: undefined
        }
    }
    , created() {
        let input = this.fast_form.getFormInput(this.name);

        // 覆盖重写默认的函数
        input.wrap(InputType.DateRange);

        input.setDom(this);
        this.input = input;

        // 提示性语句
        let holder = this.placeholder;
        if (Layers.isString(holder)) {
            this.placeholders = holder.split(',');
        } else {
            this.placeholders = holder;
        }

        // 设置快捷键
        if (this.shortcuts !== undefined) {
            let st = this.shortcuts;
            if (Layers.isBoolean(st)) {
                st = this.getDefaultShortcuts();
            }
            this.options.shortcuts = st;
        }
        this.pickerOptions = this.options;

        // 首次渲染数据 & 触发数据联动
        input.setFormatValue(this.value);
    }
    , methods: {
        /**
         * 用户输入变换事件
         * @param val
         */
        onChange: function (val) {
            this.input.changeValue(val);
        }
        /**
         * 数据受控函数，数据发生变化的时候，会通知到当前组件
         *
         * @see FastForm
         * @param val
         */
        , onChangeValue: function (val) {
            this.valueModel = val;
        }
        /**
         * 默认的快捷键设置
         *
         * 31 号计算近 3 个月会有一定问题，不过用户可以手动调整，暂不考虑解决此问题。
         * @return {[]}
         */
        , getDefaultShortcuts() {
            return [
                {
                    text: '今天',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '昨天',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        let time = start.getTime() - 3600 * 1000 * 24
                        start.setTime(time);
                        end.setTime(time);
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '近一周',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '近一个月',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setMonth(start.getMonth() - 1);
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '近三个月',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setMonth(start.getMonth() - 3);
                        picker.$emit('pick', [start, end]);
                    }
                }
            ]
        }
    }
}
</script>
